package org.ahuanlien.crm.service.impl;

import org.ahuanlien.crm.domain.BillRecord;
import org.ahuanlien.crm.domain.CaseReportBill;
import org.ahuanlien.crm.mapper.CaseReporterBillMapper;
import org.ahuanlien.crm.query.CaseReportBillQueryObject;
import org.ahuanlien.crm.service.IBillRecordService;
import org.ahuanlien.crm.service.ICaseReportBillService;
import org.ahuanlien.crm.util.LogicException;
import org.ahuanlien.crm.util.PageResult;
import org.ahuanlien.crm.util.SnGeneratorUtil;
import org.ahuanlien.crm.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.Date;
import java.util.List;

@Service
public class CaseReportBillServiceImpl implements ICaseReportBillService {

    @Autowired
    private CaseReporterBillMapper caseReportBillMapper;
    @Autowired
    private IBillRecordService billRecordService;

    public CaseReportBill getByCaseNumber(String caseNumber) {
        return caseReportBillMapper.getByCaseNumber(caseNumber);
    }

    public PageResult query(CaseReportBillQueryObject qo) {
        int count = caseReportBillMapper.queryForCount(qo);
        if (count == 0) {
            return new PageResult(count, Collections.EMPTY_LIST);
        }
        List<CaseReportBill> result = caseReportBillMapper.queryForList(qo);
        return new PageResult(count, result);
    }

    public void saveOrUpdate(CaseReportBill record) {
        if (record.getId() != null) {
            /*对当前编辑的报案单状态控制, 已经受理的报案单, 不可以再编辑*/
            if (record.getStatus() != 0) {
                throw new LogicException("当前报案单不是已报案状态不可以编辑");
            }
            caseReportBillMapper.updateByPrimaryKey(record);
        } else {
            record.setReceptionEmployee(UserContext.getCurrentUser());
            record.setCaseNumber(SnGeneratorUtil.getSn("report"));
            caseReportBillMapper.insert(record);
        }
    }


    /*受理车险报案的方法*/
    public void acceptCase(String caseNumber) {
        /*使用传入的报案单id,获取到报案单之中的 保单信息 , 以及车牌信息 , 和数据库之中的信息比对 , 如果不符合, 那么爆出自定义异常 */
        CaseReportBill caseReportBill = caseReportBillMapper.getByCaseNumber(caseNumber);
        /*在后台判断判断当前单据状态是否是可以受理 status==0 , 如果为不可受理状态 , 返回*/
        if (caseReportBill.getStatus() != 0) {
            throw new LogicException("当前报案单不是已报案状态, 不可以受理报案");
        }

        String insuranceBillNumber = caseReportBill.getInsuranceBillNumber();
        String plateNumber = caseReportBill.getPlateNumber();
        /*-----------------从后台获取到车牌信息和保单数据---------------*/
        /*查询到的保单*/
        BillRecord billRecord = billRecordService.getBySn(insuranceBillNumber);
        /*检查保单是否存在*/
        if (billRecord == null) {
            throw new LogicException("报案单中的保单信息不存在,受理报案失败");
        }
        /*检查保单的是否有效*/
        Date reportTime = caseReportBill.getReportTime();
        if (!"已缴费".equals(billRecord.getState()) || reportTime.after(billRecord.getDDate()) || reportTime.before(billRecord.getADate())) {
            throw new LogicException("报案单中的保单为无效保单, 受理报案失败");
        }
        /*获取到数据库中保单对应的车牌号*/
        String plateInRecord = billRecord.getCar().getNumber();
        if (!plateNumber.equals(plateInRecord)) {
            throw new LogicException("车牌号信息不符, 请核对车牌号 , 受理报案失败");
        }
        /*---------------如果保单和车牌信息有效,修改报案单据的状态为已受理-----------------*/
        caseReportBillMapper.changeStatus(caseNumber, CaseReportBill.ACCEPTED);
    }

    /*拒绝受理车险报案的方法*/
    public void rejectCase(String caseNumber) {
        caseReportBillMapper.changeStatus(caseNumber, CaseReportBill.REJECTED);
    }

    /*改变报案单的状态的方法*/
    public void changeStatus(String caseNumber, Integer status) {
        caseReportBillMapper.changeStatus(caseNumber, status);
    }

    /*从明细单表上查询 对应的报案单的状态是否为已受理*/
    public void checkReportBill(String caseNumber) {
        CaseReportBill caseReportBill = caseReportBillMapper.getByCaseNumber(caseNumber);
        if (caseReportBill.getStatus() != CaseReportBill.ACCEPTED) {
            throw new LogicException("当前明细单对应的报案单状态不是已受理状态, 不可以修改明细单");
        }

    }
}
